/**
 * {作业名称}
 *
 * 输入参数:
 *
 * 输出参数:
 *
 */
(() => {
  // 私有区域

  return function ({ UID, Records }) {
    // 验证输入参数
    if (!UID) throw Error("无效会话");

    // 处理逻辑
    A.db.trans('MP', conn => {
      // 加载出库单明细
      const { Rows } = A.job.CardR(UID, 'ST.出库单明细', ['出库单', '出库单.单号', '出库单.仓库', '品规', '品规.名称', '品规.商品.名称', '数量', '单价', '金额'],
        [['出库单', 'in', Records.map(r => r.ID)]]);
      if (Rows.length === 0) throw Error("没有选中的出库单明细");

      Rows.forEach(r => {
        Rows[r.出库单] = Rows[r.出库单] ?? { 总数量: 0, 总金额: 0 };
        Rows[r.出库单].总数量 += r.数量;
        Rows[r.出库单].总金额 += r.金额;

        // 加载可用的台账记录
        const { Rows: store_list } = A.job.CardR(UID, 'ST.库存台账', null, {
          Filter: [['仓库', '=', r['出库单.仓库']], ['品规', '=', r.品规], ['余量', '>', 0]],
          Order: { '生产日期': 'asc', '数量': 'asc' },
        });
        let remaining_qty = r.数量;
        let remaining_amt = r.金额;
        const results = [];
        store_list.every((store, i) => {
          if (remaining_qty > store.余量) {
            results.push({ ID: store.ID, '生产日期': store.生产日期, '数量': store.余量, '金额': store.余量 * r.单价 });
            remaining_qty -= store.余量;
            remaining_amt -= store.余量 * r.单价;
            return true;
          } else {
            results.push({ ID: store.ID, '生产日期': store.生产日期, '数量': remaining_qty, '金额': remaining_amt });
            remaining_qty = 0;
            remaining_amt = 0;
            return false;
          }
        });
        if (remaining_qty > 0) throw Error(`${r['品规.商品.名称']}规格为${r['品规.名称']}的库存不足`);
        A.job.CardW(UID, 'ST.库存台账', null, results.map(res => ({
          '仓库': r['出库单.仓库'],
          '品规': r.品规,
          '生产日期': res.生产日期,
          '数量': 0 - res.数量,
          '余量': 0,
          '单价': r.单价,
          '金额': res.金额,
          '摘要': '出库:' + r['出库单.单号'],
          '上级': res.ID,
        })));
        // 更新余量
        const ids = results.map(res => res.ID);
        A.db.execute('MP', `UPDATE ST_KCTZ A SET A.YL = (SELECT A.SL + SUM(B.SL) FROM (SELECT SJ_ID, SL FROM ST_KCTZ) B WHERE B.SJ_ID=A.ID) WHERE A.ID IN (${ids.map(id => '?').join(',')})`, ids);
      });

      // 最后更新出库单状态
      A.job.CardW(UID, 'ST.出库单', null, Records.map(r => ({
        'ID': r.ID,
        '出库日期': new Date(),
        '总数量': Rows[r.ID].总数量,
        '总金额': Rows[r.ID].总金额,
      })));
    });

    // 返回结果
    return true;
  };
})()